home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Carousel Volume 2 #1
/
carousel.iso
/
comdore
/
64apps
/
edit.arc
/
SPRITE EDITOR
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
1987-07-18
|
11KB
|
312 lines
86 REM *************************************
87 REM * *
88 REM * CREATED FOR *
89 REM * *
90 REM * THE COMMODORE EDUCATIONAL GROUP *
91 REM * *
92 REM * BY *
93 REM * *
94 REM * GARRY G. KIZIAK *
95 REM * *
96 REM * COPYRIGHT 1982 *
97 REM * *
98 REM *************************************
99 :
100 PRINT"[147]";
110 DEF FNX(X)=X-INT(X/24)*24
120 DEF FNY(X)=X-INT(X/21)*21
130 V$=""
140 DOT$="........................":BL$=" "
150 G=13*4096:CR$=CHR$(13):DE$=CHR$(20):C=1:B=6:E=14:SX=30:SY=150:X1=0:Y1=0
160 PA=200:SP=0:SC=1024+80+3:AD=32608
170 GOSUB 960
180 GOSUB 870
190 GOSUB 930
200 GOSUB 850
210 PX=0:PY=0
220 P=SC+PY*40+PX:Q=PEEK(P):R=Q
230 R=(NOTRAND128)OR(NOT128ANDR)
240 POKE P,R
250 FOR I=1 TO 30:GET A$:IF A$="" THEN NEXT:GOTO 230
260 POKE P,Q
270 IF A$="" THEN PX=FNX(PX+1):GOTO 220
280 IF A$="[157]" THEN PX=FNX(PX-1):GOTO 220
290 IF A$="" THEN PY=FNY(PY+1):GOTO 220
300 IF A$="[145]" THEN PY=FNY(PY-1):GOTO 220
310 IF A$=DE$ THEN POKE P,PEEK(P) AND 127:GOTO 680
320 IF A$=" " THEN GOSUB 660:PX=FNX(PX+1):GOTO 220
330 IF A$=CR$ THEN PX=0:PY=FNY(PY+1):GOTO 220
340 IF A$="." THEN 740
350 IF A$="[147]" THEN GOSUB 820:GOTO 210
360 IF A$="" THEN GOSUB 830:GOTO 210
370 IF A$="+" THEN 780
380 IF A$="-" THEN 800
390 IF A$="Q" THEN POKE G+21,0:PRINT "[147]";:END
400 IF A$=">" THEN C=(C+1)AND15:POKE G+39,C
410 IF A$="" THEN B=(B+1)AND15:POKE 53281,B
420 IF A$="" THEN E=(E+1)AND15:POKE 53280,E
430 IF A$="" THEN X1=1-X1:GOSUB 900:GOSUB 870:GOTO 220
440 IF A$="" THEN Y1=1-Y1:GOSUB 900:GOSUB 870:GOTO 220
450 IF A$="[133]" THEN 580
460 IF A$="[134]" THEN 600
470 IF A$="[135]" THEN 620
480 IF A$="[136]" THEN 640
490 IF A$="" THEN 1510
500 IF A$="S" THEN 1270
510 IF A$="" THEN 1030
520 IF A$="" THEN 1070
530 IF A$="" THEN 1430
540 IF A$="" THEN 210
550 IF A$="" THEN GOSUB 1860:GOTO 170
555 IF A$="\" THEN 690
556 IF A$="M" THEN POKE G+28,1
557 IF A$="H" THEN POKE G+28,0
560 GOTO 220
570 POKE G+21,0:GOSUB 930:GOSUB 870:GOSUB 850:GOTO 210
574 REM ****************************
575 REM * *
576 REM * MOVE ENTIRE SPRITE UP, *
577 REM * DOWN, LEFT, OR RIGHT *
578 REM * *
579 REM ****************************
580 J=PA*64:POKE 253,J-256*INT(J/256):POKE 254,J/256
590 SYS AD:GOSUB 850:GOTO220
600 J=PA*64+59:POKE 253,J-256*INT(J/256):POKE 254,J/256
610 SYS AD+42:GOSUB 850:GOTO220
620 J=PA*64:POKE 253,J-256*INT(J/256):POKE 254,J/256
630 SYS AD+88:GOSUB 850:GOTO220
640 J=PA*64:POKE 253,J-256*INT(J/256):POKE 254,J/256
650 SYS AD+118:GOSUB 850:GOTO220
655 REM ****************************
656 REM * *
657 REM * ERASE OR DELETE A POINT *
658 REM * *
659 REM ****************************
660 POKE P,46:PP=PA*64+PY*3+INT(PX/8)
670 POKE PP,PEEK(PP) AND 255-2^(7-(PX-INT(PX/8)*8)):RETURN
680 PX=FNX(PX-1):P=SC+PY*40+PX:GOSUB 660:GOTO 220
685 REM ****************************
686 REM * *
687 REM * ROTATE SPRITE 90 DEGREES *
688 REM * *
689 REM ****************************
690 HI=INT(PA/4):LO=PA*64-256*HI:POKE 251,LO:POKE 252,HI:SYS 32422
700 SYS 32443:SYS 32526:POKE 251,LO:POKE 252,HI
710 GET A$:IF A$<>"\" AND A$<>CR$ THEN 710
720 IF A$="\" THEN 700
730 GOTO 220
735 REM ****************************
736 REM * *
737 REM * PLOT A POINT *
738 REM * *
739 REM ****************************
740 POKE P,81
750 PP=PA*64+PY*3+INT(PX/8)
760 POKE PP,PEEK(PP) OR 2^(7-(PX-INT(PX/8)*8))
770 PX=FNX(PX+1):GOTO 220
775 REM ****************************
776 REM * *
777 REM * NEXT OR PREVIOUS SPRITE *
778 REM * *
779 REM ****************************
780 IF PA<15 OR (PA>31ANDPA<63) OR(PA>127ANDPA<255) THEN PA=PA+1:GOTO570
790 GOTO 220
800 IF(PA>13ANDPA<16) OR (PA>32ANDPA<64) OR(PA>128ANDPA<256) THEN PA=PA-1:GOTO570
810 GOTO 220
815 REM ****************************
816 REM * *
817 REM * CLEAR SPRITE *
818 REM * *
819 REM ****************************
820 FOR X=0 TO 63:POKE PA*64+X,0:NEXT:GOSUB 850:RETURN
825 REM ****************************
826 REM * *
827 REM * REVERSE SPRITE *
828 REM * *
829 REM ****************************
830 FOR X=0 TO 63:Y=PEEK(PA*64+X):Y=(NOTYAND255) OR (NOT255ANDY):POKE PA*64+X,Y
840 NEXT:GOSUB 850:RETURN
845 REM ****************************
846 REM * *
847 REM * DISPLAY SPRITE ON SCREEN *
848 REM * *
849 REM ****************************
850 POKE 251,PA*64-INT(PA/4)*256:POKE 252,PA/4
860 SYS 32526:PRINT"":RETURN
865 REM ****************************
866 REM * *
867 REM * INITIALIZE SPRITE DATA *
868 REM * *
869 REM ****************************
870 POKE G+21,0:POKE 2040+SP,PA:POKE G+39,C
880 POKE G+SP*2,SX:POKE G+SP*2+1,SY:POKE G+23,Y1:POKE G+29,X1
890 POKE G+16,2^SP:POKE G+21,2^SP:RETURN
895 REM ****************************
896 REM * *
897 REM * EXPAND/CONTRACT SPRITE *
898 REM * *
899 REM ****************************
900 SX=17:IF X1=0 THEN SX=30
910 SY=138:IF Y1=0 THEN SY=150
920 RETURN
925 REM ****************************
926 REM * *
927 REM * DISPLAY EDITING SCREEN *
928 REM * *
929 REM ****************************
930 PRINT ""TAB(29)"[180] [167]":PRINT TAB(29)"[180]PAGE [167]"
940 PRINT TAB(29)"[204][175][175][175][175][175][175][175][175][186]":PRINT "[145][145]"TAB(34)PA
950 RETURN
960 PRINT " [164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164] [175][175][175][175][175][175][175][175][175][175]"
970 PRINT " 123456789012345678901234 [146] SPRITE [157][157][157][157][157][157][157][157][157][157] EDITOR "
980 FOR X=1 TO 21
990 PRINT " "RIGHT$(" "+STR$(X),2)"[146]"DOT$" [146]":NEXT
1000 PRINT " [146]"
1010 RETURN
1015 REM ****************************
1016 REM * *
1017 REM * PROMPT FOR NEW PAGE *
1018 REM * *
1019 REM ****************************
1020 IF IN$="" THEN PA=AP:GOTO 180
1030 LI=18:COL=30:LE=3:MSG$="[146]PAGE[146]":GOSUB 1700:AP=PA:PA=VAL(IN$)
1040 PRINTLEFT$(V$,LI)TAB(COL-1)" "
1050 IF IN$="" OR PA<13 OR (PA>15ANDPA<32)OR (PA>63ANDPA<128) OR PA>255 THEN PA=AP
1060 GOTO 180
1065 REM ****************************
1066 REM * *
1067 REM * DISPLAY RANGE OF SPRITES *
1068 REM * *
1069 REM ****************************
1070 POKE G+21,0:POKE G+16,0:POKE G+23,0:POKE G+29,0:GOSUB 1250
1080 LI=8:COL=6:LE=3:MSG$="[146]FROM PAGE:[146]"
1090 GOSUB 1700:GP=PG:PG=VAL(IN$):IFIN$="" THEN PRINT "[147]":GOTO 170
1100 IF PG<0 OR PG>255 OR (PG=0 AND IN$<>"0") THEN 1080
1110 LI=8:COL=22:MSG$="[146]TO PAGE:[146]"
1120 GOSUB 1700:PH=VAL(IN$):IF PH<PG OR PH>255 THEN 1110
1130 SW=PG
1140 SUM=0:EN=SW+7:IF EN>PH THEN EN=PH:IF SW>PH THEN 170
1150 GOSUB 1250:FOR I=SW TO EN:K=I-SW:M=K:IF M>3 THEN M=M-4
1160 POKE 2040+K,I:SUM=SUM+2^K
1170 POKE G+K*2,M*48+104:L=98:L1=10:IF K>3 THEN L=155:L1=17
1180 POKE G+K*2+1,L:POKE G+39+K,1:POKE G+21,SUM
1190 PRINT LEFT$(V$,L1)TAB(M*6+9)I
1200 NEXT
1210 PRINTLEFT$(V$,20)TAB(7)" [164][164][164][164][164][164][164][164][164]"
1220 PRINTTAB(7)"PRESS SPACE BAR[146] TO CONTINUE"
1230 GET A$:IF A$<>" "THEN 1230
1240 POKE G+21,0:PRINT "[147]":SW=EN+1:GOTO 1140
1250 PRINT "[147] [164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164]"
1260 PRINT " DISPLAY SPRITES [146]":RETURN
1265 REM ****************************
1266 REM * *
1267 REM * SAVE SPRITES TO DISK *
1268 REM * *
1269 REM ****************************
1270 POKE G+21,0:PRINT "[147] [164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164]"
1280 PRINT " SAVE SPRITE DATA [146]"
1290 LI=8:COL=6:LE=3:MSG$="[146]FROM PAGE:[146]"
1300 GOSUB 1700:PG=VAL(IN$):IF IN$="" THEN PRINT "[147]":GOTO 170
1310 IF PG<13 OR (PG>15 AND PG<32) OR (PG>63 AND PG<128) OR PG>255 THEN 1290
1320 LI=8:COL=22:MSG$="[146]TO PAGE:[146]":GOSUB 1700:PH=VAL(IN$)
1330 IF PH<PG OR (PH>15 AND PH<32) OR (PH>63 AND PH<128) OR PH>255 THEN 1320
1340 BEG=PG*64:EN=PH*64+64:HI=INT(BEG/256):LO=BEG-HI*256
1350 LI=10:COL=12:LE=16:MSG$="[146]FILENAME:[146]":GOSUB 1700:FL$="0:"+IN$+",PRG,WRITE"
1360 OPEN 1,8,15,"I0":GOSUB 1810
1370 OPEN 2,8,1,FL$:GOSUB 1810
1380 PRINT#2,CHR$(LO);CHR$(HI);
1390 Y=2:FOR I=BEG TO EN:X=PEEK(I):PRINT#2,CHR$(X);:GOSUB 1810
1400 PRINT LEFT$(V$,12)TAB(12)MID$(""+"WRITING"+"[146]: ",Y)IN$:Y=3-Y:NEXT
1410 CLOSE 2:CLOSE 1
1420 PRINT "[147]":GOTO 170
1425 REM ****************************
1426 REM * *
1427 REM * LOAD SPRITES FROM DISK *
1428 REM * *
1429 REM ****************************
1430 POKE G+21,0:PRINT "[147] [164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164]"
1440 PRINT " LOAD SPRITE DATA [146]"
1450 LI=10:COL=12:LE=16:MSG$="[146]FILENAME:[146]":GOSUB 1700:FL$="0:"+IN$
1460 IF IN$="" THEN PRINT "[147]":GOTO 170
1470 OPEN1,8,15,"I0"
1480 OPEN2,8,0,FL$:GOSUB 1810:CLOSE 2:CLOSE 1
1490 LOAD FL$,8,1
1500 END
1504 REM ****************************
1505 REM * *
1506 REM * COPY SPRITES TO ANOTHER *
1507 REM * AREA IN MEMORY *
1508 REM * *
1509 REM ****************************
1510 POKE G+21,0:PRINT "[147] [164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164]"
1520 PRINT " COPY SPRITE DATA [146]"
1530 PRINT LEFT$(V$,4)" [164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164]":PRINT " ** SOURCE PAGES **"
1540 LI=7:COL=4:LE=3:MSG$="[146]FROM PAGE:[146]"
1550 GOSUB 1700:PG=VAL(IN$):IF IN$="" THEN PRINT "[147]":GOTO 170
1560 IF PG<13 OR (PG>15 AND PG<32) OR (PG>63 AND PG<128) OR PG>255 THEN 1540
1570 LI=9:COL=4:LE=3:MSG$="[146]..TO PAGE:[146]":GOSUB 1700:PH=VAL(IN$)
1580 IF PH<PG OR (PH>15 AND PH<32) OR (PH>63 AND PH<128) OR PH>255 THEN 1570
1590 PRINT LEFT$(V$,4)TAB(21)"[164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164][164]":PRINT TAB(21)"** TARGET PAGES **"
1600 LI=7:COL=24:LE=3:MSG$="[146]FROM PAGE:[146]":GOSUB 1700:PD=VAL(IN$)
1610 IF PD<13 OR (PD>15 AND PD<32) OR (PD>63 AND PD<128) OR PD>255 THEN 1600
1620 PE=PD+PH-PG:IF PE>255 THEN PE=255
1630 PRINTLEFT$(V$,9)TAB(23)"..TO PAGE:"PE
1640 IF PD>PG AND PD<=PH THEN 1670
1650 FOR I=PD TO PE:PRINT LEFT$(V$,12)TAB(12)"COPYING PAGE"I
1660 FOR J=0 TO 63:POKE I*64+J,PEEK((PG+I-PD)*64+J):NEXT:NEXT:PRINT "[147]":GOTO 170
1670 FOR I=PE TO PD STEP -1:PRINT LEFT$(V$,12)TAB(12)"COPYING PAGE"I
1680 FOR J=0 TO 63:POKE I*64+J,PEEK((PG+I-PD)*64+J):NEXT:NEXT:PRINT "[147]":GOTO 170
1690 END
1695 REM ****************************
1696 REM * *
1697 REM * INPUT ROUTINE *
1698 REM * *
1699 REM ****************************
1700 Y9=2:IN$="":UC=0:UB$=LEFT$(BL$,LE):GOSUB 1800:UB$=" ":UC=3
1710 UT=TI
1720 GET Z9$:IF Z9$="" THEN 1780
1730 IF Z9$=CR$ THEN Y9=2:GOSUB 1800:PRINT "[157][157] ":RETURN
1740 IF Z9$=DE$ THEN ON -(LEN(IN$)=0) GOTO 1780:IN$=LEFT$(IN$,LEN(IN$)-1):GOTO1780
1750 IF (ASC(Z9$)AND127)<32 OR Z9$=CHR$(34) THEN 1780
1760 IF LE=LEN(IN$) THEN 1780
1770 IN$=IN$ + Z9$
1780 GOSUB 1800:IF TI-UT<10 THEN 1720
1790 Y9=3-Y9:GOTO 1710
1800 PRINT LEFT$(V$,LI)TAB(COL-1)MID$(MSG$,Y9)UB$IN$MID$(" [146]",Y9,UC)" ";:RETURN
1805 REM ****************************
1806 REM * *
1807 REM * CHECK FOR DISK ERRORS *
1808 REM * *
1809 REM ****************************
1810 INPUT#1,A$,B$,C$,D$
1820 IF VAL(A$)=0 THEN RETURN
1830 PRINT"[147]DISK ERROR:[146] "B$
1840 CLOSE2
1850 END
1855 REM ****************************
1856 REM * *
1857 REM * VIEW SPRITE IN MOTION *
1858 REM * *
1859 REM ****************************
1860 POKE G+21,0:PRINT "[147]":POKE G+16,0
1870 X=INT(RND(1)*100)+155:Y=INT(RND(1)*100)+75:DX=4:DY=2:X2=0:Y2=0
1880 POKE G,X:POKE G+1,Y:POKE G+21,1
1890 B$=" ":X=X+DX:Y=Y+DY:GET A$:IF A$<>"" THEN 1950
1900 IF X>255 THEN X=255:DX=-DX
1910 IF Y>200 THEN Y=200:DY=-DY
1920 IF X<65 THEN X=65:DX=-DX
1930 IF Y<75 THEN Y=75:DY=-DY
1940 GOTO 1880
1950 IF A$="+" THEN DX=DX+SGN(DX):DY=DY+SGN(DY):DX=DX-(DX=0):DY=DY-(DY=0)
1960 IF A$="-" THEN DX=DX-SGN(DX):DY=DY-SGN(DY):DX=DX+(DX=0):DY=DY+(DY=0)
1970 IF A$="+" OR A$="-" THEN 1890
1980 IF A$="" THEN B=(B+1)AND15:POKE 53281,B
1990 IF A$="" THEN E=(E+1)AND15:POKE 53280,E
2000 IF A$=">" THEN C=(C+1)AND15:POKE G+39,C
2010 IF A$="" THEN X2=1-X2:POKE G+29,X2
2020 IF A$="" THEN Y2=1-Y2:POKE G+23,Y2
2030 IF A$=CR$ THEN POKE G+21,0:RETURN
2040 IF A$<>B$ THEN 1890
2050 GET B$:A$=B$:IF B$<>" " THEN 1980
2060 GOTO 1890